package IterableIterator;

import java.util.Iterator;

import TDACola.LinkedQueue;
import TDACola.Queue;
import TDALista.BoundaryViolationException;
import TDALista.EmptyListException;
import TDALista.InvalidPositionException;
import TDALista.Position;
import TDALista.PositionList;

/**
 * Clase que modela un iterador de lista. </br>
 * El iterador se modela internamente con una <i>ED Auxiliar</i> a la lista, esto es, se realiza una clonación de los elementos de la lista sobre una ED Auxiliar.</br>
 * Provee la funcionalidad de un iterador, realizando toda la operatoria sobre la ED Auxiliar. </br>
 * <b>Requiere:</b> <i>TDACola</i>.
 * @author FJoaquin (federico.joaquin@cs.uns.edu.ar)
 *
 * @param <E> Tipo de dato de los elementos de la lista a iterar.
 */
public class IteradorListaSobreEdAuxiliar<E> implements Iterator<E>{
	  private Queue<E> cola;
	  
	  /**
	   * Clona en una estructura auxiliar todos los elementos de lista.
	   * @param lista Contiene los elementos a ser iterados.
	   */
	  public IteradorListaSobreEdAuxiliar(PositionList<E> lista) {
	    cola = new LinkedQueue<E>();
	    try {
	      Position<E> cursor = lista.isEmpty() ? null : lista.first();
	      while(cursor != null) {
	        cola.enqueue(cursor.element());
	        cursor = (cursor == lista.last()) ? null : lista.next(cursor);
	      }
	    }
	    catch(EmptyListException e) { cola = new LinkedQueue<E>();}
	    catch(InvalidPositionException e1) { cola = new LinkedQueue<E>();} 
	    catch(BoundaryViolationException e2) { cola = new LinkedQueue<E>();}
	  }  
	  
	  @Override
	  public boolean hasNext(){
		  // COMPLETAR
		  return false;
	  }
	  
	  @Override
	  public E next(){ 
		  // COMPLETAR 
		  return null;
	  }
	}
